#ifndef TASK_H
#define TASK_H

#include "comm/types.h"
#include "cpu/cpu.h"
#include "tools/list.h"

#define TASK_NAME_SIZE 32
#define TASK_TIME_SLICE_DEFAULT 10  // 默认时间片 100ms = OS_TICK_MS * 10

typedef struct _task_t {
    enum {
        TASK_CREATE,
        TASK_RUNNING,
        TASK_SLEEP,
        TASK_READY,
        TASK_WAITTING,
    } state;

    uint32_t time_ticks;    // 初始时间片
    uint32_t slice_ticks;   // 剩余时间片
    uint32_t sleep_ticks;   // 休眠时间片

    char name[TASK_NAME_SIZE];
    list_node_t run_node;
    list_node_t wait_node;
    list_node_t all_node;
    tss_t tss;
    uint16_t tss_sel;    // tss选择子
} task_t;

/**
 * 任务管理器
 */
typedef struct _task_manager_t {
    task_t first_task;
    task_t idle_task;       // 空闲进程，当其它进程都休眠时调度
    task_t *curr_task;
    list_t ready_list;      //就绪队列
    list_t task_list;       //任务队列
    list_t sleep_list;      //睡眠队列

    int app_code_sel;       // 应用程序代码段选择子
    int app_data_sel;       // 应用程序数据段选择子
} task_manager_t;

int task_init(task_t *task, uint32_t entry, uint32_t esp, const char *pname);
void task_switch(task_t *from, task_t *to);
void task_manager_init(void);
void first_task_init(void);
task_t * get_first_task(void);
task_t * get_current_task(void);
void task_set_ready(task_t *task);
void task_set_block(task_t *task);
int sys_sched_yield(void);
task_t * task_next_run(void);
void task_dispatch(void);
void task_time_tick(void);
void sys_sleep(uint32_t ms);
void task_set_sleep(task_t *task, uint32_t ticks);
void task_set_wakeup(task_t *task);

#endif